本文以推荐标签latest为例,执行以下命令拉取最新版镜像:展开代码语言:BashAI代码解释dockerpullxxx.xuanyuan.run/library/eclipse-temurin:latest 可通过轩辕镜像标签列表https://xuanyuan.cloud/r/library/eclipse-temurin/tags查看所有可用标签,选择时需考虑:生产环境建议使用具体版本标签(如21.0.2 ,验证Java环境:展开代码语言:BashAI代码解释dockerrun-it--rmxxx.xuanyuan.run/library/eclipse-temurin:latestjava-version 定期更新镜像:关注轩辕镜像文档https://xuanyuan.cloud/r/library/eclipse-temurin获取安全更新,及时升级以修复漏洞。 镜像拉取:eclipse-temurin采用dockerpullxxx.xuanyuan.run/library/eclipse-temurin:{TAG}格式,推荐使用具体版本标签确保稳定性。
需要注意的是,官方library/openjdk镜像已正式弃用,仅保留早期访问版(EarlyAccessbuilds)更新,生产环境需优先选择amazoncorretto、eclipse-temurin JAR包(Ubuntu)eclipse-temurin:21-jre-ubuntu-jammydockerpulldocker.xuanyuan.run/eclipse-temurin:21-jre-ubuntu-jammy 开发编译(Alpine轻量)eclipse-temurin:17-jdk-alpine3.22dockerpulldocker.xuanyuan.run/eclipse-temurin:17-jdk-alpine3.22 最新LTS版(默认Ubuntu)eclipse-temurin:latestdockerpulldocker.xuanyuan.run/eclipse-temurin:latest开发编译(Ubuntu )eclipse-temurin:11-jdk-ubuntu-jammydockerpulldocker.xuanyuan.run/eclipse-temurin:11-jdk-ubuntu-jammy
好在 Oracle 还开源了个 OpenJDK,并且很多东西都变了。 OpenJDK 就是一个桶,什么都可以往里面装,各大公司又纷纷推出自己的 JDK,简直可以直呼看不懂。 上面还有一个 Eclipse Temurin 下载,你可能就有点困惑,我到底要下载那一个了。 经过考古,主要原因是这 2 个 OpenJDK 的 JVM 虚拟机版本不一样。 Eclipse Temurin 使用的是 Hotspot 的虚拟机。 Eclipse Temurin 提供 OpenJDK + Hotspot 映像,IBM Semeru Runtimes 将提供 OpenJDK + Eclipse OpenJ9 映像的开放和认证 (JCKed 简单总结下就是,如果你希望: OpenJDk + HotSpot 虚拟机: 下载 Eclipse Temurin 或者 RedHat 版本。
FROM eclipse-temurin:17 as build ARG MAVEN_VERSION=3.8.5 ARG BASE_URL=https://downloads.apache.org/maven RUN mvn clean package COPY target/*.jar app.jar FROM eclipse-temurin:17-jre-alpine as production COPY 例如,请参见 https://github.com/docker-library/openjdk/issues/468 。 还有另一个提供商 Adoptium(以前称为 AdoptopenJDK),在他们的 Java 版本下,称为 Temurin,它仍然提供 JRE 镜像。 你可以找到一篇关于他们的决定的好文章 https://blog.adoptium.net/2021/12/eclipse-temurin-jres-are-back/.因此,我开始使用temurin。
中应该使用 eclipse-temurin[1] 用户下的相关镜像。 SpringBootGracefulShutdownExample-0.0.1-SNAPSHOT.jar Dockerfie.bad: 使用 bash 启动脚本, 这会导致终止信号无法传递 FROM eclipse-temurin Dockerfile.bash-c: 采用 bash -c 执行, 在命令简单情况下可以做到优雅关闭 FROM eclipse-temurin:11-jdk COPY entrypoint.bad.sh 比如下面的例子: Dockerfile.tini: 加了 tini 也无法优雅关闭的情况 FROM eclipse-temurin:11-jdk RUN set -e \ && apt update 引用链接 [1] eclipse-temurin: https://hub.docker.com/_/eclipse-temurin [2] ibm-semeru-runtimes: https://hub.docker.com
中应该使用 eclipse-temurin[1] 用户下的相关镜像。 也有很多方法; 比如常见的直接使用 CMD 或 ENTRYPOINT 指令运行 java 程序: Dockerfile.direct: 直接运行 java 程序, 能够正常接受到终止信号 FROM eclipse-temurin Dockerfile.bash-c: 采用 bash -c 执行, 在命令简单情况下可以做到优雅关闭 FROM eclipse-temurin:11-jdk COPY entrypoint.bad.sh 比如下面的例子: Dockerfile.tini: 加了 tini 也无法优雅关闭的情况 FROM eclipse-temurin:11-jdk RUN set -e \ && apt update 引用链接 [1]eclipse-temurin: https://hub.docker.com/_/eclipse-temurin [2]ibm-semeru-runtimes: https://hub.docker.com
FROM eclipse-temurin:17 as build ARG MAVEN_VERSION=3.8.5 ARG BASE_URL=https://downloads.apache.org/maven RUN mvn clean package COPY target/*.jar app.jar FROM eclipse-temurin:17-jre-alpine as production COPY 但是,对于较新版本的 Java,upsteam OpenJDK 项目不再生成 JRE,因此没有仅 JRE 映像。github 上有很多关于这个问题的讨论。 还有另一个提供商 Adoptium(以前称为 AdoptopenJDK),在他们的 Java 版本下,称为 Temurin,它仍然提供 JRE 镜像。 你可以找到一篇关于他们的决定的好文章 Eclipse Temurin JREs are back! | Adoptium.因此,我开始使用temurin。
为了给你一个基础镜像大小的概念,以下是openjdk:17-jdk-slim(瘦身版)和eclipse-temurin:17-jdk-alpine镜像大小的比较:已知应用程序(jar)的大小约为20MB 使用 eclipse-temurin:17-jdk-alpine 作为基础镜像。 openjdk:17-jdk-slim 作为基础镜像的674MB小73%。 在第一阶段,我们使用 eclipse-temurin:17-jdk-alpine 镜像来使用 jlink 构建自定义JRE镜像。 在 Dockerfile 中自动化该过程Dockerfile.jlink-with-jdeps.temurin# 第一阶段,构建自定义 JREFROM eclipse-temurin:17-jdk-alpine
以下是基于不同场景的配置示例: 案例1:Spring Boot JAR应用 # 使用官方OpenJDK镜像作为基础 FROM eclipse-temurin:17-jdk-jammy # 设置工作目录 app.jar # 暴露应用端口(根据实际修改) EXPOSE 8080 # 启动命令 ENTRYPOINT ["java", "-jar", "app.jar"] 案例2:传统Java SE应用 FROM eclipse-temurin run -p 8080:8080 -d java-image-name -p:端口映射(主机端口:容器端口) -d:后台运行 优化建议 多阶段构建 减少最终镜像大小,丢弃构建阶段的依赖: FROM eclipse-temurin /gradlew build FROM eclipse-temurin:17-jre WORKDIR /app COPY --from=builder /app/build/libs/app.jar
AdoptOpenJDK (Adoptium) Adoptium 提供的 Eclipse Temurin 是一个免费的、开源的 JDK 发行版,由一个广泛的社区支持,非常稳定和可靠。 特点: 社区支持,稳定可靠 提供定期更新和安全补丁 支持多种平台 安装示例: sudo apt update sudo apt install temurin-17-jdk 2. Red Hat OpenJDK Red Hat OpenJDK 是 Red Hat 提供的开源 JDK 发行版,特别适合在企业环境中使用,Red Hat 还提供商业支持服务。 apt install liberica-jdk-17 表格总结 替代方案 提供商 主要特点 安装命令 AdoptOpenJDK Adoptium 社区支持,稳定可靠 sudo apt install temurin 参考资料 Adoptium Amazon Corretto Azul Zulu Red Hat OpenJDK Liberica JDK
不久前,我们团队需要将一个基于 Spring Boot 3.2 的后端服务进行容器化部署,但面临两个关键问题: 镜像体积过大:现有 Dockerfile 基于 openjdk:17-jdk-slim 构建的镜像高达 初始 Dockerfile 分析 原始 Dockerfile 如下(基于单阶段构建): FROM openjdk:17-jdk-slim WORKDIR /app COPY target/myapp-0.0.1 于是我们输入要求:"优化该 Spring Boot 项目 Dockerfile,减少镜像体积和启动时间" AI 输出方案: # 第一阶段:构建阶段(使用 Maven 官方镜像) FROM maven:3.9.6-eclipse-temurin application.properties 中添加: spring.main.lazy-initialization=true 最终优化版 Dockerfile: # 构建阶段 FROM maven:3.9.6-eclipse-temurin RUN mvn dependency:go-offline -o COPY src/ src/ RUN mvn clean package -DskipTests # 运行阶段 FROM openjdk
对于 Spring Boot 应用程序,建议使用 OpenJDK 基础映像。OpenJDK 是 Java 开发工具包 (JDK) 的开源实现,提供 Java 运行时环境和 Java 开发工具。 以下是使用 OpenJDK 11 基础映像的 Dockerfile 示例: FROM openjdk:17-jdk-slim COPY target/springBootDockerized-0.0.1 官方链接中使用 JRE 层,您可以找到以下内容: eclipse-temurin 作为示例 spring-boot 应用程序,添加一个 Dockerfile 到 root,如下所示: #dockerized 0.0.1-SNAPSHOT.jar #ENTRYPOINT ["java" , "-jar" , "/springBootDockerized-0.0.1-SNAPSHOT.jar"] FROM eclipse-temurin /target/*.jar app.jar RUN java -Djarmode=layertools -jar app.jar extract FROM eclipse-temurin:17.0.5
向 Adoptium 的过渡工作包括建立一个 Eclipse 工作组,并将 AdoptOpenJDK 拆分为 Adoptium 顶级项目下的多个子项目:Eclipse AQAvit、Eclipse Temurin 和 Eclipse Temurin Compliance。 微软有一个,Eclipse 有 Adoptium with Temurin,Oracle 也有他们自己的,还有 Azul、AWS Corretto、Red Hat、Liberica、SAP Machine Eclipse 的品牌建设尤其令人困惑:Adoptium 是 Eclipse 里面的一个小组,而 Eclipse 也是一个小组。你在使用 Temurin,它是 OpenJDK。 想象一下,假如你在自己学习 Java,碰到这样一句话:"Eclipse Temurin 是 Adoptium 提供的 OpenJDK 发行版的名字"。品牌名称还是越少越好。
该发行版支持OpenJDK的全部长期支持(LTS)版本,包括8,11,17和21。 ● 即便只有一个Gradle工程,若它声明能够同时支持多个Java语言版本和JDK发行版,比如OpenJDK和Kona的版本8,11和17。 该特性不仅支持了国际流行的OpenJDK发行版,也支持了Kona。具体地,它为Kona分配了常量JvmVendorSpec.TENCENT。 + Eclipse Temurin JDK 11.0.23+9 | Location: /path/to/.sdkman/candidates/java/11.0.23 -tem | Language Version: 11 | Vendor: Eclipse Temurin | Architecture:
version "11.0.12" 2021-07-20 OpenJDK Runtime Environment Temurin-11.0.12+7 (build 11.0.12+7) OpenJDK 64-Bit Server VM Temurin-11.0.12+7 (build 11.0.12+7, mixed mode) root@2324d2daa74d:/# cd /usr/local :~# mv /opt/java/openjdk/bin/java11.bak /opt/java/openjdk/bin/java #换回了java11 root@2324d2daa74d:~ # java -version openjdk version "11.0.12" 2021-07-20 OpenJDK Runtime Environment Temurin-11.0.12+7 (build 11.0.12+7) OpenJDK 64-Bit Server VM Temurin-11.0.12+7 (build 11.0.12+7, mixed mode)
# 第一阶段:构建阶段 FROM maven:3.9-eclipse-temurin-17 AS builder WORKDIR /build COPY pom.xml . # 利用层缓存,先只复制pom /src RUN mvn clean package -DskipTests # 第二阶段:运行阶段 FROM eclipse-temurin:17-jre-jammy RUN groupadd -r FROM eclipse-temurin:17-jre-jammy # 使用非root用户运行 RUN groupadd -r spring && useradd -r -g spring spring FROM eclipse-temurin:17-jre-jammy ARG JAR_FILE=target/*.jar ARG PROFILE=dev COPY ${JAR_FILE} app.jar 实际构建示例 让我们通过一个完整的Spring Cloud Config Server的Dockerfile示例来总结: # 多阶段构建示例 FROM maven:3.9-eclipse-temurin
Silver 4116 @ 2.1 GHz (12 cores total / 24 threads) ,128 GiB RAM ,RHEL 8 x86_64 2、JDKs(用于编译和运行) JDK 11 openjdk 11.0.12 2021-07-20 OpenJDK Runtime Environment Temurin-11.0.12+7 (build 11.0.12+7) OpenJDK 64-Bit Server VM Temurin-11.0.12+7 (build 11.0.12+7, mixed mode) JDK 16 openjdk 16.0.2 2021-07-20 OpenJDK Runtime Environment (build 16.0.2+7-67) OpenJDK 64-Bit Server VM (build 16.0.2+7-67, mixed mode, sharing) JDK 17 (下载日期为 2021-09-06) openjdk 17 2021-09-14 OpenJDK Runtime Environment (build 17+35-2724) OpenJDK 64
在这里,需要对Java做特别的说明,虽然官方提供了一个OpenJDK的基础镜像,但这个基础镜像已经不再维护了. 我现在用的都是eclipse-temurin这个Java基础镜像, 这也是Docker官方提供的. 使用统一的定制基础镜像 有时候你可能需要在基础镜像基础之上,添加一些定制的能力或功能. FROM my-company/base-java:17.0.3 比如,构建了一个基于eclipse-temurin的自己的定制基础镜像. FROM eclipse-temurin:17.0.6_10-jre RUN useradd -ms /bin/bash lingen USER lingen 定义一个用户是非常简单的, 如上代码所示.
比如,你一定知道的OpenJDK,它是一个完全开源免费的版本,你不需要为使用OpenJDK付费。 由于Oracle在19年4月的这个改变,在业界造成了很大的争议,许多团队已经迁移至使用OpenJDK了,OpenJDK的使用占比已经高于OralceJDK了 基于OpenJDK的其它发行版本 其实,不只是 OpenJDK,许多大公司基于OpenJDK都发行与维护着自己的JDK,列举一些如下: • Red Hat Build of OpenJDK • Microsoft Build of OpenJDK • Eclipse Temurin by Adoptium • 阿里的Dragonwell 等,这个列表其实可以很长。 但很多Java程序员会疑问,OpenJDK与Oralce JDK究竟有什么区别,这些不同的OpenJDK发行版本是否可靠?
核心库、内存安全性能、可观测性和安全性,以及广泛的第三方库、工具和SDK支持,继续使Java成为企业用户的强大选择,而2024年这些原因并没有终结Java的增长,”Oracle Java平台高级副总裁兼OpenJDK Eclipse基金会通过Jakarta EE等项目支持企业Java开发人员,并领导Temurin和Adoptium项目,今年取得了显著进展,基金会执行董事Mike Milinkovich表示。 “在Eclipse基金会,我们在2024年庆祝了一个重要的里程碑,我们实现了Eclipse Temurin OpenJDK发行版的5亿次总下载量。 Eclipse Temurin是基于OpenJDK的开源Java SE构建。Jakarta EE是一套规范,它使用分布式计算和Web服务等企业功能的规范扩展了Java SE。 Java社区和生态系统演变 与此同时,关于Java社区和行业的进展,在整个2024年,我们看到许多不同的组织与Java的管理者Oracle在OpenJDK社区一起合作,继续在全球范围内推动Java的发展